多线程编程学习笔记——线程池(一)

 接上文 多线程编程学习笔记——线程同步(一)

【题外话】

 接上文 多线程编程学习笔记——线程同步(二)

闲的低俗竟然想尝尝测试自己做的类型在不同操作系统上的性能表现,所以决定尝试在Linux上布置Apache和Mono的环境。由于常常很少接触Linux,所以从网上找了几篇随笔(附在相关链接中)尝试,部署的历程也休想一帆风顺,所以就按照自己在Azure上安排的情况再一次举办了整理,希望对很少接触Linux的同班有所协助。以下有所操作均在Azure上的虚拟机里安排,假使在该地或者虚拟机里部署,可能率先还需要配备网卡设置等。

  接上文 多线程编程学习笔记——线程同步(三)

 

 

【作品索引】

 

  1. 在Ubuntu下安装Apache
  2. 在Ubuntu下安装Mono
  3. 在Ubuntu下部署ASP.NET网站
  4. 在openSUSE下的操作
  5. 在CentOS下的操作
  6. 有关链接

     
创建多线程操作是分外昂贵的,所以每个运行时刻非凡短的操作,创造多线程进行操作,可能并不可能进步效率,反而降低了效用。

 

     
假使你有那多少个多的举行时间相当短的操作,那么适合功能线程池来提高功效,而不是自动创设多线程。

【一、在Ubuntu下安装Apache】

     
线程池,就是我们先分配一些资源到池塘里,当大家需要采取时,则从池子中取得,用完了,再放回池子里。

Ubuntu
Server安装将来,默认没有图形界面,其实在Linux不用图形界面也很容易就足以拓展配置。在Azure上安排好Ubuntu
Server(这里运用Azure上提供的Ubuntu Server 12.04
LTS,2013/6/24)未来,会自行配置好SSH的22端口,我们可以直接利用SSH工具连接服务器,这里运用免费开源的PuTTY(http://www.putty.org/)。假设在Azure上配置的施用密码连接主机则这里直接输入地方点击“Open”即可,假设还上传了SSH密钥,则还应在Connection/SSH/Auth里拔取相应的密钥才足以连续不断。

    
.NET中的线程池是受CLR管理的,TheadTool类有一个QueueUserWorkItem静态方法,那多少个静态方法接受一个信托,代表用户自定义的一个异步操作,在那么些情势被调用之后,委托会进入到其中队列中,假诺池中没无线程,则创立一个工作线程,把第一个委托放入工作线程。虽然持续放入委托,则池成立新的办事线程,直到工作线程数量达到上限。这时再放入委托,则不会创制新的干活线程,而是在队列中伺机,直到有空暇的工作线程。

图片 1

      
当线程池中所有操作都形成,而且从不新职责操作时,线程池会释放长日子不用的资源。

连日来后输入设置的用户名和密码即可登录Ubuntu系统,会出现如下图的命令行,我们所做的几乎拥有工作都是经过命令行操作的。

      
注意:放入线程池中的操作需要的时日要短,不要把需要长日子运作的操作放入线程池中,或不通工作线程。那将造成性能问题和特别不便调用的题材。

图片 2

                
在ASP.NET中使用线程池要小心,ASP.NET中的线程池是一个共用线程池,假若线程池中的工作线程都用完了,则会促成WEB服务器对正常的HTTP请求无法提供服务。

在Ubuntu下安装软件其实特别便于,Ubuntu提供了apt-get工具,可以利用该工具间接下载安装软件。

 

在Linux里,系统最高权力账户为root账户,而默认登录的账户并非root账户,例如不享有安装程序等权力,不过同Windows一样都提供了晋级权限的办法,就是sudo命令,在履行的每条命令前增长“sudo
”,即可以root账户的权位履行。在率先次接纳sudo时会要求输入当前账户的密码,确认后即可在一段时间(默认5分钟)内采取sudo命令都不需要输入密码,一段时间没有使用后则需要重新输入密码。

一、     线程池中调用委托

率先大家设置Apache,输入下列命令,之后会提醒是否安装等,输入Y继续。软件包详情:http://packages.ubuntu.com/quantal/apache2

 1.代码之类:

sudo apt-get install apache2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; 

namespace ThreadPoolDemo
{


    public delegate string ThreadPoolRun(out int threadId);
    class Program
    {  

        static void Main(string[] args)
        {

            Console.WriteLine("开始测试线程池-委托。。。");
            int threadId = 0;
            ThreadPoolRun poolDele = RunThread;
            var t = new Thread(() => RunThread(out threadId));
            t.Start();
            t.Join();
            Console.WriteLine("线程ID {0} ",threadId);
            IAsyncResult r = poolDele.BeginInvoke(out threadId, Callback, "在线程池中同步调用回调函数");
            string result = poolDele.EndInvoke(out threadId, r);
            Console.WriteLine("线程池中工作线程ID :{0}", threadId);
            Console.WriteLine("返回结果:{0}",result); 

            Thread.Sleep(2000);
            Console.Read(); 

        }

        private static void  Callback(IAsyncResult r)
        {

            Console.WriteLine("开始调用回调函数。。。");
            Console.WriteLine("回调函数此时的状态 :{0}",r.AsyncState);
            Console.WriteLine("调用此回调函数的线程是否在线程池 :{0}", Thread.CurrentThread.IsThreadPoolThread);
            Console.WriteLine("调用此回调函数的线程在线程池在的ID :{0}", Thread.CurrentThread.ManagedThreadId);
        }

        private static string RunThread(out int threadId)
        {
            Console.WriteLine("开始工作。。。");       

            Console.WriteLine("调用此回调函数的线程是否在线程池 :{0}", Thread.CurrentThread.IsThreadPoolThread);
            Thread.Sleep(TimeSpan.FromSeconds(2));
            threadId = Thread.CurrentThread.ManagedThreadId;
            return string.Format("此线程在线程池在的ID :{0}", threadId);
        }
    }
}

图片 3

2.程序执行结果如下图。

等候一段时间后,Apache就会活动安装配备好,这时候能够配备好Azure上的80端口,配置好后选拔浏览器访问服务器的地方可以见见如下图的提拔,表明安装成功。

 图片 4

图片 5

      
下边的程序运行时,我们第一创造线程来实施委托操作,然后调用委托的BeginInvoke来举办回调方法,那么些回调函数会在异步操作完成之后会被调用,并且会把一个自定义的值传给这一个回调函数,最终大家会拿到一个落实了IAsyncResult接口的result对象,当线程池的办事线程在进行工作时,允许大家继续其他操作。我们得以轮询result对象的IsCompleted属性,确定操作是否到位。也可以调用EndInvoke将IAsyncResult传给委托参数。

 

 

【二、在Ubuntu下安装Mono】

二、     线程池中放入异步操作

Linux有个开源的.NET运行时,叫做Mono(http://www.mono-project.com/),可以支撑在Linux上运行.NET应用程序。

 1.代码之类:

仍然按上述方法输入下列命令安装Mono及C#编译器,软件包详情:http://packages.ubuntu.com/quantal/mono-gmcs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; 

namespace ThreadPoolDemo
{ 
    class Program
    {   

        static void Main(string[] args)
        {
            Console.WriteLine("开始测试线程池-QueueUserWorkItem。。。");
            const int x = 1;
            const int y = 2;
            string workState = "工作状态 2"; 

            ThreadPool.QueueUserWorkItem(AsyncOper);
            Thread.Sleep(1000);
            ThreadPool.QueueUserWorkItem(AsyncOper,"同步状态");
            Thread.Sleep(1000);

            ThreadPool.QueueUserWorkItem(status => {
                Console.WriteLine("操作状态 {0} ", status);
                Console.WriteLine("线程池中工作线程ID :{0}", Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(TimeSpan.FromSeconds(2));
            },"工作状态");


            ThreadPool.QueueUserWorkItem(_ => {
                Console.WriteLine("操作结果x+y= {0} ,{1}", x+y,workState);
                Console.WriteLine("线程池中工作线程ID :{0}", Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(TimeSpan.FromSeconds(2));
            }, "工作状态"); 

            Thread.Sleep(2000);
            Console.Read();
        }

        private static void  AsyncOper(object status)
        {
            Console.WriteLine("操作状态 :{0} ",status??"null");

            Console.WriteLine("工作线程在线程池在的ID :{0}", Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(2000);
        }  

    }
}
sudo apt-get install mono-gmcs

2.推行结果如下。程序执行了两遍。

设置完后可以输入“mono
-V”查看安装的mono的本子(注意V是大写的),当然也足以写个C#的ConsoleApp看看,可以用下列命令编译C#代码。

图片 6

gmcs test.cs

      
程序首先定义了一个AsyncOper方法,然后采取QueueUserWorkItem将以此措施放入线程池中,然后再次放入一个AsyncOper方法,不过本次给艺术调用传一个目标。

假诺程序没有问题的话则会生成test.exe,可以由此如下命令执行。当然也可以在Windows上编译好exe文件后复制到Linux上进行也是足以的。

      
代码中的调用Thread.sleep方法,是为着让线程池中的工作线程为新操作重用。请留心打印出来的ThradId,倘诺ThreadID一样则印证六个操作重用了同一个干活线程。

mono test.exe

 

接下去按照自己索要的本子拔取安装Apache对ASP.NET 2.0或者ASP.NET
4.0的支撑,mono-apache-server2为ASP.NET
2.0的支撑,mono-apache-server4是ASP.NET
4.0,两者可以而且存在,切换需要在Apache的配置文件中切换。软件包详情:http://packages.ubuntu.com/quantal/mono-apache-server2

 

sudo apt-get install mono-apache-server2

不晓得为什么,安装到最终会卡在那个地方

图片 7

只好经过Ctrl+Z强制退出,然后输入“sudo
reboot”重启服务器,但是Linux服务器很快就能重启完

后来再安装Apache的模块libapache2-mod-mono即可。当然,mono-gmcs、mono-apache-server2、libapache-mod-mono都是足以联手安装的,不过要留意mono-apache-server2和libapache-mod-mono的顺序,假诺mono-apache-server2在libapache-mod-mono之后的话,由于看重项的案由,libapache-mod-mono会现在活动采用安装mono-apache-server4。而且,假诺一起装的话,在上述卡住的地方Ctrl+Z重启后,libapache-mod-mono并不曾配备完成导致众多操作不可以实施,还亟需执行“sudo
dpkg –configure
-a”这句发号施令才行。软件包详情:http://packages.ubuntu.com/quantal/libapache2-mod-mono

sudo apt-get install libapache2-mod-mono

而是安装完假若打开网站发现如故无能为力履行,其实是尚未配置ASP.NET应用程序。即使现在帮助自动配置应用程序,可是还是需要修改/etc/apache2/mods-available/mod_mono.conf文件。(原文见:http://www.mono-project.com/AutoConfiguration)当然假若你会手动配置应用程序的话也得以在该公文中手动配置应用程序(下同)。

sudo vim /etc/apache2/mods-available/mod_mono.conf

图片 8

按键盘上的i键启用vim的编排形式,由于mono-server2-hosts.conf文件中曾经对广大参数举办了布置,所以仅需要按图中的添加“MonoAutoApplication
enabled”一行即可。其它,假使你的网站中还有其余的文件格式(比如HttpHandler平时使用.axd),请添加在第一行前面,其余假诺网站默认文件不是index.aspx还亟需修改第二行后的公文名。注意,由于Linux是分别轻重缓急写的,所以切记不要把大小写搞错。

虽然服务器上还设置了ASP.NET
4.0的支撑(mono-apache-server4),并且需要切换来ASP.NET
4.0,那么仅需要修改最后一行,将2改为4即可。

修改完后按Ctrl+C停止编辑形式,然后按冒号键(:)进入命令情势,输入w保存文件,然后再一次按冒号键,再按q键退出vim。

末尾执行下述命令重启Apache服务器即可。

sudo /etc/init.d/apache2 restart 

 

【三、在Ubuntu下部署ASP.NET网站】

在Windows上部署网站可以由此远程桌面直接把网站或打包好的网站复制过去,在Linux下实际SSH不光可以帮忙命令行,还足以支撑文件传输,我这边运用免费开源的Filezilla(https://filezilla-project.org/),Filezilla匡助FTP和SSH二种协议,在站点管理器中采用SFTP协议,然后把登陆类型设置为常规,输入用户名和密码即可登录。

图片 9

签到后默认的路径为/home/用户名/,就跟命令行下默认的目录一致。Apache的默认路径在/var/www/,可以在这之下找到index.html,也就是不行“It
works”的网页。可是那么些目录一般用户的权柄为无法写入,所以不可以将网站间接配备到这一个目录下。当然你可以在PuTTY下将那么些目录的权杖修改后再上传,然则事实上还足以有更简单的主意,就是将包裹文件上传到用户目录下然后再解压缩到这个目录下。

第一安装zip解压缩程序,软件包详情:http://packages.ubuntu.com/quantal/zip

sudo apt-get install zip

接下来将索要上传的网站打包为zip文件,然后上传到用户目录下(/home/用户名/),然后在命令行中输入就足以了。

sudo unzip 压缩文件名.zip -d /var/www

自然,现在用你的浏览器访问你的服务器地址依旧是“It
works”,我们还要删除index.html就可以了。

sudo rm /var/www/index.html

 

【四、在openSUSE下的操作】

不同的系列应用不同的软件包管理程序,SUSE则提供了一个叫zypper的软件包管理程序,使用也不行有利于(这里运用的openSUSE是Azure上提供的openSUSE
12.3)。

率先是安装Apache。

sudo zypper install apache2

与Ubuntu安装过程不同的是,在安装到位后并不曾启动Apache的指示。所以还索要手动配置服务自启动。

sudo systemctl enable apache2.service

接下来登时启动Apache。

sudo systemctl start apache2.service 

今昔用浏览器就足以访问服务器了。

下一场使用zypper安装Mono了(其中System.Drawing会用到libgdiplus,多语言帮忙会用到mono-locale-extras,可是固然这样还有一部分零部件没有设置,前面会表达):

sudo zypper install mod_mono libgdiplus mono-locale-extras

接下去需要安排mod_mono,这里推荐应用官方提供的http://go-mono.com/config-mod-mono/,页面打开后如下图所示:

图片 10

可以接纳Virtual
Host或者Application二种格局,第一种可以依照请求的服务器地址设置ASP.NET网站的根路径,第二种可以按照请求的虚拟目录设置ASP.NET网站的根路径。除此之外页面下方还有多少个设置可以自定义,设置完后增选页面下方的Download下载.conf文件,将文件上传到openSUSE服务器后采纳如下命令复制到Apache配置文件夹下:

sudo cp 配置文件名.conf /etc/apache2/conf.d/

事后方可像Ubuntu一样给openSUSE安装上zip解压缩工具(sudo zypper install
zip),将压缩文件解压缩到安装的网站根目录后即可。之后只需要重启Apache服务器后就可以及时访问ASP.NET网站了:

sudo systemctl restart apache2.service

急需小心的是,这样形成后不像Ubuntu把众多凭借库都装上了,假若按上述命令的话只有以下部件被设置:

图片 11

由此可能还有不少亟待的组件没有设置,比如需要连接Oracle数据库时,可能提醒找不到System.Data.OracleClient程序集,需要安装“mono-data-oracle”,到时候可以依照出现的失实再安装。其实也足以按照通配符安装“mono*”,把跟mono有关的都安装上,不过这样也会装很多不需要的零部件。

 

【五、在CentOS下的操作】

CentOS的软件管理程序是yum(这里运用的CentOS是Azure上提供的CentOS 6.3)。

先是仍旧设置Apache。

sudo yum install httpd

与openSUSE类似,安装完需要自己手动配置服务自启动。

sudo chkconfig --levels 235 httpd on

接下来立时启动Apache服务。

sudo /etc/init.d/httpd start

现今再用浏览器访问服务器地址就可以正常访问Http服务器了。

然则CentOS官方尚未打包好的mono的rpm包,所以比较好的不二法门是上下一心编译。

首先配置好编译的条件。

sudo yum install gcc gcc-c++ bison pkgconfig glib2-devel gettext make freetype-devel fontconfig-devel libX11-devel libpng-devel libjpeg-devel libtiff-devel giflib-devel libexif-devel cairo-devel httpd-devel

恐怕会唤醒需要升级kernel-headers,可是系统或许默认禁止了基本的包,所以只要出现上述命令无法实施安装的话,还需要在上一条命令之后附加“ –disableexcludes=main”,即如下的款型。

sudo yum install gcc gcc-c++ bison pkgconfig glib2-devel gettext make freetype-devel fontconfig-devel libX11-devel libpng-devel libjpeg-devel libtiff-devel giflib-devel libexif-devel cairo-devel httpd-devel --disableexcludes=main

倘使一切安装成功,可以推行下列语句下载需要设置组件的源码包并解压缩。

cd /usr/src/
sudo wget http://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.tar.bz2
sudo wget http://download.mono-project.com/sources/mono/mono-2.10.8.tar.bz2
sudo wget http://download.mono-project.com/sources/xsp/xsp-2.10.tar.bz2
sudo wget http://download.mono-project.com/sources/mod_mono/mod_mono-2.10.tar.bz2

sudo tar jxf libgdiplus-2.10.tar.bz2
sudo tar jxf mono-2.10.8.tar.bz2
sudo tar jxf xsp-2.10.tar.bz2
sudo tar jxf mod_mono-2.10.tar.bz2

编译并安装libgdiplus。

cd /usr/src/libgdiplus-2.10
sudo ./configure --prefix=/usr
sudo make ; sudo make install

接下来编辑/etc/ld.so.conf文件,添加一行“/usr/lib/”,如下图所示,保存之后再进行如下命令,从而使系统可以将libgdiplus.dll自动映射到相应的so文件中。(原文见:http://www.mono-project.com/DllNotFoundException

图片 12

sudo ldconfig

然后是Mono。

cd /usr/src/mono-2.10.8
sudo ./configure --prefix=/usr
sudo make ; sudo make install

接下去安装xsp。

export PKG_CONFIG_PATH=/usr/lib/pkgconfig
cd /usr/src/xsp-2.10
sudo ./configure --prefix=/usr
sudo make ; sudo make install

然后安装mod_mono。

cd /usr/src/mod_mono-2.10
sudo ./configure --prefix=/usr
sudo make ; sudo make install

下一场再修改“/etc/httpd/conf/mod_mono.conf”这些文件,与Ubuntu上同名的部署文件配置相同。然而由于不像Ubuntu下有现成的布局文件,所以需要在文件中添加如下两行,由于设置的时候自动安装了2.0和4.0的扶助,所以可以将如下的2换为4即可启用ASP.NET
4.0:

MonoServerPath "/usr/bin/mod-mono-server2"
MonoAutoApplication enabled

接下来将部署文件复制到Apache的布置文件目录中: 

sudo cp /etc/httpd/conf/mod_mono.conf /etc/httpd/conf.d/

鉴于CentOS自带的SELinux的缘故,使得Apache不可能连接到mod-mono-server,所以大家前几天还需要配置SELinux。当然,这里为了简单就只有禁用SELinux,有趣味的可以友善创立安全策略,使mod-mono-server可以生效。这里修改/etc/sysconfig/selinux文件。将“SELINUX=enforcing”修改为“SELINUX=permissive”或“SELINUX=disabled”,例如下图,保存重启系统即可。

图片 13

从此将来就足以经过SSH将网站打包上传上去就可以直接访问了。不过需要专注的是,CentOS上的Apache默认的根路径在“/var/www/html”下,当然也得以在“/etc/httpd/conf/httpd.conf”文件中修改存放网站根目录的路径。

 

【六、相关链接】

1、配置linux(apache) + mono 下运行
asp.net:http://www.cnblogs.com/hcl0208/archive/2010/10/25/1860173.html 2、openSUSE上安装Mono并发布ASP.Net程序:http://www.linuxidc.com/Linux/2011-04/34872.htm 3、CentOS 6.0 安装
MONO
2.10.8:http://www.cnblogs.com/aquilahkj/archive/2011/11/03/2234380.html 4、Mono环境下不匡助普通话的解决措施:http://www.cnblogs.com/shanyou/archive/2010/10/08/1846198.html

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注